SMDX

Содержание

Введение

Файл SMDX (Summary MoDel eXtensible) представляет собой подписанный цифровой подписью zip-архив, с данными в общепринятых форматах (json, png, pdf) и включает в себя:
  • сводную информационную модель;
  • прикрепленные документы (опционально);
  • выходные документы (опционально);
  • исходную геометрию (опционально).
Для просмотра SMDX-файла может быть использована утилита «Инспектор проектов Топоматик Robur», web-приложения, типа 360.topomatic.ru, или программы других разработчиков.

Структура файла SMDX

Документ SMDX – это zip-архив, корневые элементы которого имеют фиксированные имена.
Файл content.json содержит семантическую информацию и ссылки на все элементы информационной модели.
Примечание. Файлы формата json (JavaScript Object Notation) являются структурированными текстовыми файлами, для редактирования которых используется любой текстовый редактор, например, «Блокнот» (Notepad). Нотация json-файлов подразумевает использование пар ключ/значение для описания состояния объекта. Пары разделяются символом «,». Ключ и значение разделены символом «:».
Также внутри SMDX-файла расположены следующие папки:
geometry – файлы формата json с расширением j3d. Файлы j3d содержат геометрические данные трёхмерных моделей.
materials – файлы формата json с расширением jmtl с описание материалов, поверхностей трёхмерных моделей. Материалы могут использовать текстуры и шейдеры.
textures – файлы растровых изображений в формате png (Portable Network Graphics), используемые в материалах.
effects – файлы шейдеров — текстовые файлы с расширение fx, содержащие в себе инструкции на языке программирования GLSL.
documents – материалы фото и видеофиксации, текстовые документы, таблицы, чертежи и другие файлы произвольного формата, ассоциированные с элементами информационной модели.

Описание информационной модели content.json

Файл content.json содержит следующие пары ключ/значение для описания цифровой модели:
Ключ wcs - Массив координат X, Y, Z базовой точки модели относительно которой будут располагаться все элементы цифровой модели.
Пример:
"wcs": [ 18507.6695087205, 9450.49877065809, 67.5458837355353 ]
Ключ insertions - Массив, содержащий информацию о расположении элементов цифровой модели в пространстве. Каждое описание состоит из следующих параметров:
  • geometry – индекс массива ключа geometry;
  • group – индекс массива ключа group;
  • position – массив со значениями приращения координат относительно координат базовой точки описанной в значении ключа wcs. Полученные значения в последствии используются в качестве точки вставки трёхмерной модели;
  • scale – массив значений масштаба по осям XYZ. Если параметр отсутствует, то используется значение по умолчанию равное единице по всем трём осям;
  • angle – числовое значение угла поворота элемента относительно нормали в радианах. Если параметр отсутствует, то используется значение по умолчанию равное нулю;
  • normal – массив координат XYZ вектора к плоскости, в которой расположен элемент. Если параметр отсутствует, то используется значение по умолчанию, где X = 0, Y = 0, Z = 1 ([0.0, 0.0, 1.0]).
Пример:
"insertions": [ 	 
        { "geometry": 5, "group": 31, "position": [ 14.36481, -258.5793, 3.175319 ], "scale": [
1.011675, -1.00532, 1 ], "normal": [ -0.139017, 0.08973963, 0.9862155 ], "angle": 2.144023 },  
        { "geometry": 5, "group": 31, "position": [ 14.36481, -253.5793, 2.917289 ], "scale": [
-1.011675, 1.000008, 1 ], "normal": [ -0.1514821, -7.2001E-05, 0.98846 ], "angle": 4.712389 }]
Ключ geometry - Массив, содержащий информацию о трёхмерных моделях, используемых в построении цифровой модели. Каждое описание может содержать следующий набор параметров:
  • href – имя файла с расширением j3d расположенного в папке geometry;
  • bounds – массив координат XYZ описывающих границы трёхмерного объекта;
  • lods – массив параметров, описывающих выбор трёхмерной модели с разной детализацией в зависимости от расстояния до точки обзора в окне просмотра. Используется для оптимизации работы графического процессора.
Пример:
"geometry": [ 
        { "href": "lining.j3d", "bounds": [ -0.9927897, -0.08525, 0.09433599, 0.9927897, 0.08525, 0.2325319 ], "lods": [ 
                { "distance": 25, "href": "lining-lod300.j3d"}, 
                { "distance": 50, "href": "lining-lod50.j3d"} 
            ] 
        }, 
        { "href": "vegetation31.j3d", "bounds": [ -2.720446, -2.808087, 0, 2.792925, 2.829055, 0.5194162 ], "lods": [ 
                { "distance": 0, "href": "vegetation2F.j3d" }             ] 
        }] 
Ключ textures - Массив, содержащий описание текстур, используемых при рендеринге цифровой модели. Каждое описание может содержать следующий набор параметров:
  • name – имя текстуры;
  • width – ширина текстуры;
  • height – высота текстуры;
  • format – перечисление, указывающее на используемые каналы. 0 –альфа канал, 1 – сплошной цвет + альфа канал, 2 – оттенки серого, 3 – сплошной цвет;
  • filter – перечисление, указывающее на тип текстуры. 0 – текстура, хранящая цвета, 1 – карта нормалей;
  • mipmaps – литерал принимающий значение true или false, указывающий необходимость генерации mipmap-уровней;
  • source – массив описаний областей используемой текстуры.
Пример:
"textures": [ 	 
        { 
            "name": "vegetation2F.j3d.agt", 
            "width": 256, 
            "height": 256, 
            "format": 0, 
            "filter": 0, 
            "mipmaps": false, 
            "source": [ 
                { 
                    "width": 256, 
                    "height": 256, 
                    "x": 0, 
                    "y": 0, 
                    "target": [ 
                        { 
                            "world": [ 1, -1.22460635382238E-16, 0, 0, 1.22460635382238E-16, 1, 
0, 0, 0, 0, 1, 0, -7.5, -7.5, 0, 1 ], 
                            "view": [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1.30000001192093, 1 ], 
                            "projection": [ 0.2, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 3.33333320087857, 0, 0, 0, -3.33333320087857, 1 ], 
                            "geometry": "vegetation.j3d", 
                            "technique": "RenderTexture" 
                        }, 
                        { 
                            "world": [ -6.12303176911189E-17, -1, 0, 0, -1, 6.12303176911189E-
17, 0, 0, 0, 0, 1, 0, -2.5, -7.5, 0, 1 ], 
                            "view": [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1.30000001192093, 1 ], 
                            "projection": [ 0.2, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 3.33333320087857, 0, 0, 0, -3.33333320087857, 1 ], 
                            "geometry": "vegetation2F.j3d", 
                            "technique": "RenderTexture" 
                        } 
                    ] 
                } 
            ] 
	    },
Ключ types - Массив, содержащий описание типов элементов, используемых в цифровой модели. Каждое описание состоит из следующих параметров:
id – идентификатор типа;
name – имя типа;
parent – индекс массива types, указывающий на родительский тип. Текущий тип будет наследовать свойства своего родительского типа;
properties – массив описаний свойств присущих данному типу.
Пример:
"types": [ 
        { "id": "SmdxElement", "name": "Элемент проекта", 
            "properties": [ 
                { "tag": "status_type", "name": "Статус", "value": "DESIGNED", 
                    "info": { 
                        "type": "enum", 
                        "values": { 
                            "UNDEFINED": "Не определено", 
                            "EXISTING": "Существующий", 
                            "DESIGNED": "Проектный", 
                            "DISMANTLING": "Демонтируемый", 
                            "DISMANTLED": "Демонтированный"}
                    } } 
            ] 
        }, 
        { "id": "SmdxSurface", "name": "Поверхность", "parent": 0, 
            "properties": [ 
                { "tag": "area2d", "name": "Площадь 2D", 
                    "info": { 
                        "type": "float", 
                        "units": "m^2" 
                    } }, 
                { "tag": "area3d", "name": "Площадь 3D", 
                    "info": { 
                        "type": "float", 
                        "units": "m^2" 
                    } } 
            ] 
        }] 
Ключ groups - Массив содержащий описание групп, в которые собираются элементы массива ключа insertion. Каждое описание может содержать следующий набор параметров:
name – имя группы;
parent – индекс массива groups, указывающий на родительскую группу. Текущая группа будет наследовать свойства своей родительской группы;
type – индекс массива types, указывающий на тип, используемый для данной группы;
properties – массив описаний свойств присущих данной группе.

Описание трёхмерной модели j3d

В одном файле с расширением j3d может содержаться описание только одной трёхмерной модели. Трёхмерная модель состоит из полигональных сетей (Mesh). Mesh’ы описываются парой ключ/значение, где ключом будет имя mesh’а, а значением будет набор пар ключ/значение с описанием геометрических данных этого mesh’a.
Геометрические данные описаны при помощи следующих пар ключ/значение:
Ключ positions – массив координат XYZ описывающих опорные точки треугольников из которых состоит mesh;
Ключ triangles – массив целых чисел, используемый для получения индекса треугольника, полученного из массива positions. Первое значение уже является индексом, а последующие индексы получаются посредством сложения текущего индекса и следующего значения массива triangles;
Ключ textures – массив текстурных координат XY описывающих область текстуры, используемую треугольником. Количество элементов массива соответствует количеству элементов массива positions;
Ключ groups – набор параметров, определяющий материалы и интервалы треугольников, использующие их.
Пример:
{ 
"main_0":{ 
 	"positions":[4.639927,268.59,31.72411,5.04136,268.59,31.70411,5.081371,268.1459,31.77418,4.5961 07,268.1426,31.72619], 
 	"triangles":[2,-1,-1,0,3,-1], 
 	"textures":[0.1546642,8.953,0.1680453,8.953,0.169379,8.938197,0.1532036,8.938087], 
 	"groups":{ 
 	 	"default1.jmtl":[0,1] 
 	 	}  	} 
} 

Materials

Файлы с расширением jmtl содержат информацию о материалах, используемых трегольниками трёхмерных моделей. Набор свойств, описанных в файле зависит от типа материала. Тип материала Blinn-Phong обладает стандартным набором свойств для данного алгоритма:
type – тип материала;
ambient– фоновое освещение;
diffuse– рассеянный свет;
specular– бликовая составляющая;
shininess– резкость зеркальных бликов;
level– уровень яркости;
blur– степень размытия;
transparency– степень прозрачности;
illumination– сила свечения;
shading– тип затенения;
Пример:
{ 	 
    "type": "Blinn–Phong", 
    "ambient": [ 0.01176471, 0.007843138, 0.003921569 ],     "diffuse": [ 0.01176471, 0.007843138, 0.003921569 ], 
    "specular": [ 1, 1, 1 ], 
    "level": 0.4, 
    "shininess": 0.2, 
    "blur": 0, 
    "transparency": 0, 
    "illumination": 0, 
    "shading": "Wire", 
    "flags": 0, 
    "wire": 1 
	} 
Для типа материала Effect, использующего шейдеры, набор свойств будет определяться самим шейдером и может быть любым.
Пример:
{ 
    "type": "Effect", 
    "name": "Leaf.fx", 
    "technique": "Main", 
    "format": 34, 
    "vs": "VS_1_1", 
    "ps": "PS_1_1", 
    "title": "", 
    "description": "", 
    "order": 0, 
    "define": "", 
    "variables": [ 
        { "name": "BasicTexture", "type": "texture2D", "value": "PineLeaf.png", "compress": 
true, "mipmaps": true, "normals": false, "height": false, "title": "ShaderParameter", 
"description": "", "widget": "Texture", "hidden": false }, 
        { "name": "Center", "type": "float3", "value": [ -114.1763, 85.94911, 1224.606 ], 
"title": "ShaderParameter", "description": "", "widget": "", "hidden": false }     ] 
} 

Спецификация формата

SMDX является форматом с открытой спецификацией.
Спецификация формата доступна по адресу: http://smdx.info/.
Также на сайте представлен пример информационной модели и ссылка на репозиторий типов на GitHub: https://github.com/smdxtypes/smdx